/*
 * Project Name : NOBUNAGA
 * Created on 2007/03/15
 */
package jp.sengoku.oda {
	import mx.controls.TextInput;
	import mx.controls.Button;
	import mx.controls.List;
	import mx.controls.ComboBox;
	import flash.events.Event;
	import flash.events.FocusEvent;
	import mx.collections.ArrayCollection;


	/**
	 * 入力した文字列で入力候補を絞り込むコンボボックス
	 * 
	 * @auther	morimotohiroki@gmail.com
	 */
	public class ToshiieTextInput extends ComboBox {
		public function ToshiieTextInput() {
			//TODO: implement function
			super();
			this.editable = true;
		}

		// 閉じるフラグ
		private var _closeFlag:Boolean = false;

		// フィルタリングするときに使うフィールド名		
		private var _filterLabel:String;
		
		// フィルタリングするかどうか
		private var _filterFlag:Boolean = true;

		/**
		 * dropdownリストを閉じさせなくする
		 * 
		 * @see mx.controls.ComboBox
		 * @param	trigger	Event
		 * @return	void
		 */
		override public function close(trigger:Event=null):void {

			// 閉じることを許可するでござる
			if (_closeFlag) {
				super.close(trigger);
			// 無視
			} else {
			}	
		}

		/**
		 * 前方一致
		 * 
		 * @param	item	Object
		 * @return	Boolean	入力文字列とデータが一致すればtrue
		 */
		private function _filterFunction(item:Object):Boolean {
			
			if (!_filterFlag) {
				return true;
			} else {
				var s:String;
				
				if (item.hasOwnProperty(_filterLabel)) {
					s = item[_filterLabel].toString();
				} else {
					s = item.toString();
				}
				return textInput != null && s.indexOf(textInput.text) == 0;
			}
		}

		/**
		 * フォーカスインイベントハンドラ
		 * 
		 * @param	event	FocusEvent
		 * @return	void
		 */
		override protected function focusInHandler(event:FocusEvent):void {
			// 閉じさせない
			this._closeFlag = false;
			// dropdownを開く
			this.open();
			// 処理する
			super.focusInHandler(event);

			// XXX:ここではなく、フィルタリングを設定したときに与えたり、dataProviderに値を与えたときに実行			
			(this.dropdown.dataProvider as ArrayCollection).filterFunction = _filterFunction;
			(this.dropdown.dataProvider as ArrayCollection).refresh();
			
		}
		
		/**
		 * フォーカスアウトイベントハンドラ
		 * 
		 * @param	event	FocusEvent
		 * @return	void
		 */
		override protected function focusOutHandler(event:FocusEvent):void {
			// 閉じさせる
			this._closeFlag = true;
			// 処理する
			super.focusOutHandler(event);
		}

		/**
		 * テキスト入力時のイベントハンドラ
		 * 
		 * @param	event	Event
		 * @return	void
		 */		
		override protected function textInput_changeHandler(event:Event):void {
			// 処理する
			super.textInput_changeHandler(event);
			// フィルタリング
			(this.dropdown.dataProvider as ArrayCollection).refresh();
		}

	}
}